package com.alks.function.mapper.stockdept.pcfactorystockquery;

import com.alks.entity.data.entity.*;
import com.alks.function.data.dto.stockdept.pcfactorystockwork.SubMtlDto;
import com.alks.function.data.request.stockdept.pcfactorystockwork.*;
import com.alks.function.data.vo.controller.stockdept.MtlDocumentVo;
import com.alks.function.data.vo.stock.MtlAccVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.Mapper;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 材料库存表 Mapper 接口
 * </p>
 *
 * @author ms
 * @since 2023-09-15
 */
@Mapper
public interface SD_SQ_PcMtlAccMapper extends BaseMapper<PcMtlAcc> {
    /*查询替换所需材料*/
    List<SubMtlDto> subMtlQuery(SubMtlQueryRequest request);

    /*获取库存量*/
    List<Map<String, Object>> getStkQty(List<String> maps);

    /*更新实发后库存余量*/
    void DrawActProUp(@Param("request") List<PcDrawDetail> request);

    /*贴合出库后更新库存*/
    void fdMtlSumUpdate(@Param("request") List<MtlSumUpRequest> request);

    /*取消贴合出库回滚*/
    void fdMtlSumCancel(@Param("mtlNo") List<Map<String,Object>> mtlNo);

    List<PcSlipTemp> getOtMtlWaitStk2(@Param("request") List<OMtlwaitAddRequest> request);

    /**
     * 材料转入仓库
     * @param checks 入库数据
     * @param companyId 公司ID
     */
    void purStockUpdate(@Param("checks") List<PcMtlCheck> checks, @Param("companyId") String companyId);

    /*扣除退货数量*/
    void MtlRtPcUpdate(@Param("request") List<RtCheckUpRequest> request, @Param("companyId") String companyId, @Param("now") LocalDate now);

    /*【仓储部-其他材料出入库】 出入库*/
    void otherMtlInStockAdd(@Param("temps") List<PcSlipTemp> temps, @Param("slipType") String slipType, @Param("companyId") String companyId);

    /**
     * 回滚入库库存
     * @param mtlNos
     * @param companyId
     */
    void stkReduceByMap(@Param("mtlNos") Map<String, BigDecimal> mtlNos, @Param("companyId") String companyId);

    /**
     * 回滚出库库存
     * @param mtlNos
     * @param companyId
     */
    void stkAddByMap(@Param("mtlNos") Map<String, BigDecimal> mtlNos, @Param("companyId") String companyId);

    /**
     * 通用入库
     * @param mtlNos
     * @param companyId
     */
    void stkInByMap(@Param("mtlNos") Map<String, BigDecimal> mtlNos, @Param("companyId") String companyId);

    /**
     * 通用出库
     * @param mtlNos
     * @param companyId
     */
    void stkOutByMap(@Param("mtlNos") Map<String, BigDecimal> mtlNos, @Param("companyId") String companyId);

    /**
     * 更新单据时间
     * @param mtlNos
     */
    void recDateUp(@Param("mtlNos") List<String> mtlNos, @Param("date") LocalDateTime date ,@Param("companyId") String companyId);

    /**
     * 更新交易时间
     * @param mtlNos
     */
    void traDateUp(@Param("mtlNos") List<String> mtlNos, @Param("date") LocalDateTime date , @Param("companyId") String companyId);

    /**
     * 通过物料编号和公司ID获取库存
     * @param mtlNos
     * @param companyId
     * @return
     */
    List<Map<String, Object>> getStkQty(@Param("mtlNos") List<String> mtlNos, @Param("companyId") String companyId);

    /**
     * 判断是否建党
     * @param mtlNos
     * @param companyId
     * @return
     */
    List<String> mtlNoDocumentCheck(@Param("mtlNos") List<String> mtlNos, @Param("companyId") String companyId);

    /**
     * 通用建党
     * @param vos
     */
    void mtlDocumentCreate(@Param("vos") List<MtlDocumentVo> vos);

    /**
     * 仓库盘点
     * @param read 盘点数据
     * @param companyId 公司ID
     */
    void mtlInvCount(@Param("read") List<MtlAccVo> read, @Param("companyId") String companyId);

    /**
     * 材料基础信息建档
     */
    void mtlAccBaseIn(@Param("accList") List<PcMtlAcc> accList);

    /**
     * 补全所有物料
     */
    void getAllMtl(@Param("companyId") String companyId);

    /**
     * 补全所有入库物料
     */
    void getAllInMtl(@Param("companyId") String companyId);

    /**
     * 查询库存不足物料
     */
    List<String> queryStkShort(@Param("detaiList") List<PcDrawDetail> detaiList, @Param("companyId") String companyId);

    /**
     * 根据物料信息更新库存
     * @param accList 物料集合
     * @param companyId 公司ID
     */
    void inByMtlList(@Param("accList") List<PcMtlAcc> accList, @Param("companyId") String companyId);

    /**
     * 根据具体信息库存变更
     * @param mtlAcc 物料信息
     */
    void stkUpByMtl(@Param("mtlAcc") PcMtlAcc mtlAcc);

    /**
     * 子材料出入库
     */
    void subFitMtlUp(@Param("baseVo") PcSubOutLog baseVo, @Param("companyId") String companyId);

    /**
     * 找出库存不足部分
     */
    List<PcMtlAcc> findStkMiss(@Param("logList") List<PcSubOutLog> logList, @Param("companyId") String companyId);

    /**
     * 判断物料是否存在
     *
     * @param findAcc 物料信息
     * @return
     */
    Integer existCheck(@Param("findAcc") PcMtlAcc findAcc);
}
